package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflect_Test {
    public static void main(String[] args) throws Exception {
//        获取该类的class对象
//        //1、获取Student类的class对象
//        Class<Student> cls1= (Class<Student>) Class.forName("reflect.Student");
//        //2.通过类名称.class获取class对象
//        Class<Student> cls2=Student.class;
//        //3.通过Student对象的getClass方法
//        Class<Student> cls3= (Class<Student>) new Student().getClass();
//        System.out.println(cls1==cls2);
//        System.out.println(cls1==cls3);
//          Person p=new Student();
//        System.out.println(p.getClass());
//        Class<Student> cls=Student.class;
//        //获取public权限的构造方法
//        Constructor[] con1= cls.getConstructors();
//        for (Constructor constructor:con1){
//            System.out.println(constructor);
//        }
//        System.out.println("--------------------------");
//        //获取该类所有的构造方法
//        Constructor[] con2=cls.getDeclaredConstructors();
//        for (Constructor constructor:con2){
//            System.out.println(constructor);
//        }
//        Class<Student> cls=Student.class;
//        //获取指定类型的有参构造
//        Constructor<Student> con1=cls.getDeclaredConstructor(String.class,int.class,String.class);
//        System.out.println(con1);
//        Student stu=con1.newInstance("小熊",18,"男");
//        System.out.println(stu);
        //通过反射破坏private封装，调用私有构造方法
//        Class<Student> cls=Student.class;
//        Constructor<Student> con=cls.getDeclaredConstructor(String.class);
//        con.setAccessible(true);
//        Student student=con.newInstance("小熊");
//        System.out.println(student);
//        //获取要调用方法的Method对象
//        Class<Student> cls=Student.class;
//        Method method=cls.getDeclaredMethod("test");
//        //test是静态方法
//        method.invoke(null);
//        //fun是普通方法
//        Method method1=cls.getDeclaredMethod("fun",String.class);
//        Student student=new Student("小熊",18,"男");
//        method1.invoke(student,"小熊很帅");
        //获取拿到的属性Field对象
        Class<Student> cls=Student.class;
        Field field=cls.getDeclaredField("country");
        System.out.println(field.get(null));
        Field field1=cls.getDeclaredField("age");
        Student student=new Student("小熊",18,"男");
        System.out.println(field1.get(student));
        field1.set(student,20);
        System.out.println(field1.get(student));
    }


}
